//package com.demo.statemachine.d01;
//
//import com.demo.statemachine.d01.EventEnum;
//import com.demo.statemachine.d01.StatusEnum;
//import org.apache.catalina.authenticator.SavedRequest;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.context.annotation.Bean;
//import org.springframework.context.annotation.Configuration;
//import org.springframework.statemachine.config.EnableStateMachine;
//import org.springframework.statemachine.config.EnumStateMachineConfigurerAdapter;
//import org.springframework.statemachine.config.builders.*;
//import org.springframework.statemachine.config.common.annotation.AnnotationBuilder;
//import org.springframework.statemachine.listener.StateMachineListener;
//import org.springframework.statemachine.listener.StateMachineListenerAdapter;
//import org.springframework.statemachine.transition.Transition;
//
//import java.util.EnumSet;
//
///**
// * 状态机状态配置
// * @author Administrator
// */
//@Configuration
//@EnableStateMachine
//public class StateMachineConfig extends EnumStateMachineConfigurerAdapter<StatusEnum, EventEnum> {
//    @Autowired
//    SaveAction saveAction;
//    /**
//     * 初始化状态机状态
//     */
//    @Override
//    public void configure(StateMachineStateConfigurer<StatusEnum, EventEnum> states) throws Exception {
//        states.withStates()
//                // 定义初始状态
//                .initial(StatusEnum.UNCONNECTED)
//                // 定义状态机状态
//                .states(EnumSet.allOf(StatusEnum.class));
//    }
//
//    /**
//     * 初始化状态迁移事件
//     */
//    @Override
//    public void configure(StateMachineTransitionConfigurer<StatusEnum, EventEnum> transitions)
//            throws Exception {
//        transitions
//                // 1.连接事件
//                // 未连接 -> 已连接
//                .withExternal()
//                .source(StatusEnum.UNCONNECTED)
//                .target(StatusEnum.START)
//                .event(EventEnum.CONNECT)
//                .and()
//
//                // 2.更新事件
//                // 已连接 -> 更新中
//                .withExternal()
//                .source(StatusEnum.START)
//                .target(StatusEnum.UPDATE)
//                .event(EventEnum.UPDATE).action(saveAction)
//                .and()
//                // 更新过期人员
//                .withExternal()
//                .source(StatusEnum.START)
//                .target(StatusEnum.UPDATE_EXPER)
//                .event(EventEnum.UPDATE_EXPER)
//                .and()
//
//                .withExternal()
//                .source(StatusEnum.UPDATE_EXPER)
//                .target(StatusEnum.END)
//                .event(EventEnum.UPDATE_SUCCESS)
//                .and()
//                // 3.更新成功事件
//                //更新中 -> 已完成
//                .withExternal()
//                .source(StatusEnum.UPDATE)
//                .target(StatusEnum.END)
//                .event(EventEnum.UPDATE_SUCCESS)
//                .and()
//
//                // 5.结束事件
//                // 已完成 -> 未连接
//                .withExternal()
//                .source(StatusEnum.END)
//                .target(StatusEnum.UNCONNECTED)
//                .event(EventEnum.END)
//        ;
//    }
//
////    /**
////     * 配置事件监听 ，可采用注解方式配置（StateMachineEventConfig 是注解方式配置类）
////     * @param config
////     * @throws Exception
////     */
////    @Override
////    public void configure(StateMachineConfigurationConfigurer<StatusEnum, EventEnum> config) throws Exception {
////        config.withConfiguration().autoStartup(true)
////                .listener(listener());
////    }
////    @Bean
////    public StateMachineListener<StatusEnum, EventEnum> listener() {
////        return new StateMachineListenerAdapter<StatusEnum, EventEnum>() {
////            @Override
////            public void transition(Transition<StatusEnum, EventEnum> transition) {
////                //当状态
////                if (transition.getTarget().getId() == StatusEnum.UNCONNECTED) {
////
////                    return;
////                }
////                if (transition.getTarget().getId() == StatusEnum.START) {
////
////                    return;
////                }
////                if (transition.getTarget().getId() == StatusEnum.UPDATE) {
////
////                    return;
////                }
////                if (transition.getTarget().getId() == StatusEnum.UPDATE_EXPER) {
////
////                    return;
////                }
////                if (transition.getTarget().getId() == StatusEnum.END) {
////                    return;
////                }
////
////            }
////        };
////    }
//
//    @Override
//    public boolean isAssignable(AnnotationBuilder<org.springframework.statemachine.config.StateMachineConfig<StatusEnum, EventEnum>> builder) {
//        return super.isAssignable(builder);
//    }
//
//    @Override
//    public void configure(StateMachineConfigBuilder<StatusEnum, EventEnum> config) throws Exception {
//        super.configure(config);
//    }
//
//    @Override
//    public void configure(StateMachineModelConfigurer<StatusEnum, EventEnum> model) throws Exception {
//        super.configure(model);
//    }
//
//
//
//
//}
